\section{Métodos}
\noindent El código implementado se encuentra en el archivo \verb+icmp_client.py+. Para el armado y envío de paquetes se utilizó \verb+Scapy+ una herramienta de manipulación de paquetes implementada en Python (\verb+http://www.secdev.org/projects/scapy/+).

\subsection{Ping}
\noindent La implementación de \verb+ping+ es simple. Armamos un paquete \verb+ICMP+ sobre \verb+IP+ de la siguiente forma:

\begin{verbatim}
	packet = IP(dst=dst_ip, ttl = ttl) / ICMP(type="echo-request") / "TP2 Redes"
\end{verbatim}


\noindent Notar el paquete es de tipo \textit{echo-request} y que podemos ajustar el \verb+TTL+ del paquete (lo seteamos por default en 64, que es lo que usa la implementación en Unix.). Al enviarlo, usando la función \verb+sr1(...)+, se espera automáticamente la respuesta.\\

\noindent Adicionalmente, la implementación permite medir y devolver el tiempo que se tardó en enviar el paquete y recibir la respuesta. Esto nos sirvió para realizar el análisis sobre \verb+traceroute+.

\subsection{Traceroute}
\noindent Para implementar \verb+traceroute+ nos basamos en la función \verb+ping+ ya implementada. Básicamente, hacemos \verb+ping+ a la dirección destino aumentado en cada paso el \verb+TTL+ en 1 hasta llegar a 30. El primer paquete, con \verb+TTL = 1+, llegará al primer nodo y regresará con su información. El segundo, con \verb+TTL = 2+, llegará al segundo nodo y así sucesivamente. Al llegar al nodo destino, dejamos de enviar paquetes.\\

\noindent Rescatamos la IP de cada nodo intermedio y el tiempo que se tardó en ir y volver el paquete (\verb+RTT+). Teniendo la IP pudimos obtener más información, como la ciudad, país y coordenadas. Esto lo logramos utilizando la API que provee \verb+http://freegeoip.net/+. \\

\noindent Un ejemplo de entrada de traceroute:

\begin{verbatim}
	180.87.12.54   554 ms   Maharashtra, Pune    India   18.5333  73.8667
\end{verbatim}

\noindent Con esta información logramos identifcar fácilmente si una ruta utiliza algún enlace transatlántico. Adicionamente, la implementación provee una funcionalidad extra para calcular su RTT promedio, enviando N paquetes a cada nodo.\\

\newpage
\noindent Para usar el traceroute normal:

\begin{verbatim}
	sudo python icmp_client.py www.google.com
\end{verbatim}

\noindent Para usarlo calculando promedio de RTT:

\begin{verbatim}
	sudo python icmp_client.py www.google.com -avg
\end{verbatim}

\subsection{Medición de RTT mínimo}
\noindent Un RTT teórico sigue la formula $2*(T_{prop} + T_{tx})$. En el enunciado se asume una velocidad de propagación de $2*10^5 km/s$. Sabiendo que $T_{prop}= Distancia / V_{prop}$, sólo resta utilizar las distancias medidas entre los nodos (distancia lineal). Teniendo las coordenadas de los nodos con nuestro \verb+traceroute+, utilizamos la herramienta:

\verb+http://www.movable-type.co.uk/scripts/latlong.html+. \\

\noindent Por otro lado, asumimos que el $T_{tx}$ es despreciable. Si tomamos un medio lento (comparado con la velocidad que deberían tener los enlaces transatlánticos) como Ethernet 10Base-T (10 Mbit/s), resulta que: $T_{tx} = 1/ V_{tx} = 1 / 10000000 seg$. En enlaces más rápidos, como suponemos que son los que analizamos, ese número es aún menor.

\subsection{Medición de RTT real}
\noindent Para medir el RTT real, utilizamos la información provista por nuestro \verb+traceroute+ usando \verb+-avg+ para promedios. Las rutas pueden cambiar con el tiempo y pueden estar más o menos congestionadas a lo largo del día. Por esto, realizamos varias mediciones en diferentes momentos. Luego, estos \verb+RTT+ se compararon con los teóricos del punto anterior.
